/**
 * @file MessengerServer.cpp
 * @author wuzhuqingfeng (banyincanjiu@163.com)
 * @brief
 * @version 0.1
 * @date 2023-03-20
 *
 * @copyright Copyright (c) 2023 xxxx公司
 *
 * @par 修改日志:
 * <table>
 * <tr><th>Date       <th>Version <th>Author  <th>Description
 * <tr><td>2023-03-20 <td>v1.0     <td>chen     <td>内容
 * </table>
 */

#include "MessengerI_.h"  //接口文件
#include <fstream>
#include <iostream>

/**
 * @brief  we create an instance of our Messenger_i implementation
           class, activate it in the RootPOA, and wait for requests from clients
 * @param [in] argc
 * @param [in] argv
 * @return int
 *
 * @details
 * 1、servant:是实例化的object,是组成服务程序，是为客户端提供服务的某个运行中的对象（c++/java）
 * 2、object 与 servant 是一对多的关系,一个对象可以被实例化多次
 *     一个object可以被实例化多次,注册到一个或多个oa中，为一个或多个client提供服务,
 *     各servant 对应不同的ior,每个servant都由 ior唯一确定
 * 3、stub 桩，也叫存根，负责 “假扮” servant为client提供一个本地化接口,并负责与orb进行交互,
 *    完成调用请求的打包与解包
 * 4、skeleton 与stub对应,负责调用参数在服务端的解包和调用返回的打包
 * 5、ORB Core 屏蔽底层通信细节
 * 6、OA: 对象适配器，是ORB 与Servant 之间的桥梁，
 */
int main(int argc, char* argv[]) {
    try {
        // 向CORBA发出API调用,获得一个ORB对象标记
        CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);

        // 获取所要服务的对象标记
        CORBA::Object_var obj = orb->resolve_initial_references("RootPOA");
        PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in());

        // 激活实例管理器POAManager
        PortableServer::POAManager_var mgr = poa->the_POAManager();
        mgr->activate();

		/*****************************  业务代码 start *****************************/
        // 实例管理器创建服务对象 servant 
		//用户实现接口类Messenger_i
        PortableServer::Servant_var<Messenger_i> servant = new Messenger_i();

        // Register the servant with the RootPOA, obtain its object reference,
        PortableServer::ObjectId_var oid = poa->activate_object(servant.in());
        obj = poa->id_to_reference(oid.in());
   
        CORBA::String_var str = orb->object_to_string(obj.in());//把对象类型转换为字符串类型

        // 将对象标记写入到文件中
        ofstream iorFile("Messenger.ior");
        iorFile << str.in() << std::endl;
        iorFile.close();
        std::cout << "IOR written to file Messenger.ior" << std::endl;

		/*****************************  业务代码 end *****************************/
        // Accept requests from clients.
        orb->run();
        orb->destroy();

        return 0;
    } catch (CORBA::Exception& ex) {
        std::cerr << "MessengerServer CORBA exception: " << ex << std::endl;
    }
    return 1;
}
